home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / DCLAP 6d / dclap6d / DClap / DClipboard.cpp < prev    next >
Text File  |  1996-07-05  |  6KB  |  315 lines

  1. // UClipboard.cp 
  2.  
  3.  
  4. #include "DClipboard.h"
  5. #include <dgg.h>
  6. #include <DWindow.h>
  7. #include <DPanel.h>
  8. #include <DTaskMaster.h>
  9. #include <DApplication.h>
  10. #include <DViewCentral.h>
  11.  
  12. #ifdef WIN_MAC
  13.     // undef some conflicts b/n Types.h && NlmTypes
  14. #undef Handle
  15. #include <Scrap.h>
  16. #endif
  17.  
  18.  
  19. DClipboardMgr* gClipboardMgr = NULL;             
  20.  
  21.  
  22. class DInitClipboard {
  23. public:
  24.     DInitClipboard()     { gClipboardMgr = new DClipboardMgr(); }  
  25. };
  26.  
  27. DInitClipboard globalInit; // do init now
  28.  
  29.  
  30.  
  31.  
  32. // class DClipboardMgr
  33.  
  34.  
  35. DClipboardMgr::DClipboardMgr() : DTaskMaster(0)
  36. {
  37.     fClipView = NULL;
  38.     fClipOrphan= NULL;
  39.     fClipWindow = NULL;
  40.     fGotClipType = FALSE;
  41.     fOldScrapStuff= NULL;
  42.     fNewScrapStuff= NULL;
  43.     gClipboardMgr = this;
  44.     fPrefClipType = Str2Idtype("TEXT"); // kPICT, ...
  45.     
  46. #ifdef WIN_MAC
  47.     fOldScrapStuff= MemNew(sizeof(ScrapStuff));
  48.     fNewScrapStuff= MemNew(sizeof(ScrapStuff));
  49. #endif
  50.  
  51.  
  52. void DClipboardMgr::AboutToLoseControl(Boolean convertClipboard)
  53. {
  54.     if (convertClipboard) {
  55.         if (fClipView && !fClipWrittenToSystem) {
  56. #ifdef WIN_MAC
  57.             long err = ZeroScrap();
  58. #endif
  59. #if FIX
  60.              fClipView->WriteToSystemClipboard();  //WriteToDeskScrap
  61. #endif
  62.              fClipWrittenToSystem = TRUE;
  63.             this->LoadSystemClip();
  64.         }
  65.     }
  66. }  
  67.  
  68.  
  69. void DClipboardMgr::LoadSystemClip()
  70. {
  71. #ifdef WIN_MAC
  72.     ScrapStuff* newscrap = InfoScrap();
  73.     MemCpy( fOldScrapStuff, fNewScrapStuff, sizeof(ScrapStuff));
  74.     MemCpy( fNewScrapStuff, newscrap, sizeof(ScrapStuff));
  75. #endif 
  76. }  
  77.  
  78.  
  79.  
  80. void DClipboardMgr::CheckSystemClip()
  81. {
  82.     this->LoadSystemClip();
  83. #ifdef WIN_MAC
  84.     if (((ScrapStuff*)fOldScrapStuff)->scrapCount 
  85.      != ((ScrapStuff*)fNewScrapStuff)->scrapCount) {
  86. #if FIX
  87.         fClipView->FreeFromClipboard();         
  88. #endif
  89.         fClipView = NULL;     
  90.         this->ReadFromSystem();
  91.     }
  92. #endif
  93. }  
  94.  
  95.  
  96.  
  97. long DClipboardMgr::GetDataToPaste(char* data, ulong datalen, long& clipKind)
  98. {
  99.     long length= 0;
  100.     if (fGotClipType) {
  101.         clipKind = fPrefClipType;
  102. #if FIX
  103.         length = fClipView->GivePasteData(data, datalen, clipKind);
  104. #endif
  105.         if (length < 0) ; //Failure((OSErr)length, 0);
  106.         }
  107.     else 
  108.         length = -1;
  109.     return length;
  110. }  
  111.  
  112.  
  113.  
  114.  
  115. void DClipboardMgr::Launch()
  116. {
  117.     // Create the clip window and default view 
  118.     fClipWindow = this->MakeClipboardWindow();
  119.     DView* aview= fClipWindow->FindSubview(kIDClipView);
  120.     if (aview) fClipOrphan = aview;
  121.  
  122.     // Add the clipboard manager as an application behavior
  123.     //gApplication->AddBehavior(this);
  124.  
  125.     this->LoadSystemClip();
  126.     this->ReadFromSystem();
  127.  
  128.  
  129.  
  130. class DClipView : public DNotePanel {
  131. public:
  132.     short fTestFlag;
  133.     DClipView( DWindow* aWindow) :
  134.         DNotePanel( DClipboardMgr::kIDClipView, aWindow, "Clip view"),
  135.         fTestFlag(0)
  136.         {}
  137.     virtual ~DClipView();
  138. };
  139.  
  140. class DClipWindow : public DWindow {
  141. public:
  142.   short  fTestShort;
  143.     DClipWindow() :
  144.      DWindow( DClipboardMgr::kIDClipView+1, NULL, DWindow::document, -5, -5, -50, -20, "Clipboard"),
  145.      fTestShort(0)
  146.      {}
  147.     virtual ~DClipWindow();
  148. };
  149.  
  150. DClipWindow::~DClipWindow()
  151. {
  152.     if (fTestShort) ; // debugger stop point... do we get here !?
  153. }
  154.  
  155. DClipView::~DClipView()
  156. {
  157.     if (fTestFlag) ; // debugger stop point... do we get here !?
  158. }
  159.  
  160. DWindow* DClipboardMgr::MakeClipboardWindow()
  161. {
  162.     DClipWindow* aWindow= new DClipWindow(); 
  163.     if (!fClipOrphan) fClipOrphan= new DClipView( aWindow);
  164.     fClipView = fClipOrphan;
  165.     return aWindow;
  166.  
  167.  
  168. void DClipboardMgr::ReadFromSystem()
  169. {
  170.     DView* aViewForClipboard = this->MakeViewForAlienClipboard();
  171.     this->SetClipView(aViewForClipboard);
  172.     fClipWrittenToSystem = TRUE;     
  173. }  
  174.  
  175.  
  176. DView* DClipboardMgr::MakeViewForAlienClipboard()
  177. {
  178.     DView * aView = NULL;
  179.     //aView= gApplication->MakeViewForAlienClipboard();
  180.     if (!aView) aView = fClipOrphan;
  181.     return aView;
  182. }  
  183.  
  184. void DClipboardMgr::RegainControl(Boolean checkClipboard)
  185. {
  186.     if (checkClipboard) this->CheckSystemClip();
  187. }  
  188.  
  189.  
  190. void DClipboardMgr::SetClipView(DView* clipView)
  191. {
  192.     if (fClipWindow && clipView != fClipView) {
  193.         // get the old clip window scroller if possible
  194.         DView * theSuperView;
  195.         Boolean haveview;
  196.         theSuperView = fClipWindow;
  197.             
  198.             // throw out any views contained in the scroller (or window)
  199.         haveview= false;
  200.         if (theSuperView->fSubordinates) {
  201.             short i, n= theSuperView->fSubordinates->GetSize();
  202.             //for (i=0; i<n; i++) 
  203.             for (i=n-1; i>=0; i--) {
  204.                 DView* subview= (DView*) theSuperView->fSubordinates->At(i);
  205.                 //?? if (fClipWindow->IsVisible()) subview->Close();
  206.                 haveview= (subview == clipView); 
  207.                 Boolean dodelete= (!haveview && subview != fClipOrphan);
  208. #if 1
  209.                 if (subview) {
  210.                     theSuperView->RemoveSubview(subview, false);
  211.                     if (dodelete) {
  212.                  //mswin is failing here at times
  213.                         if (subview->fSubordinates) subview->DeleteSubviews();
  214.                         delete subview; subview= NULL;
  215.                         // RemoveSubview == theSuperView->fSubordinates->AtDelete(i);
  216.                         }
  217.                     }
  218. #else
  219.                 theSuperView->RemoveSubview(subview, dodelete);
  220. #endif
  221.                 }
  222.             }
  223.         
  224.             // pop in the new clipview
  225.         if (clipView) {
  226.             if (!haveview) theSuperView->AddSubordinate(clipView);
  227.             clipView->SetSuperior(theSuperView->GetNlmObject()); 
  228.             clipView->Invalidate();
  229.             clipView->Disable();     
  230.             fClipWrittenToSystem = (clipView == fClipOrphan);
  231.             }
  232.         }
  233.     fClipView = clipView;
  234.  
  235.  
  236. void DClipboardMgr::DoSetupMenus()
  237. {
  238.     gViewCentral->EnableView(DApplication::kShowClipboard);
  239. }  
  240.  
  241.  
  242. void DClipboardMgr::CanPaste(long clipKind)
  243. {
  244. #if FIX
  245.     if (fClipView && !fGotClipType)
  246.         if (fClipView->ContainsClipType(clipKind)) {
  247.             fGotClipType = TRUE;
  248.             fPrefClipType = clipKind;
  249.             }
  250. #endif
  251.     if (fGotClipType)
  252.         gViewCentral->EnableView(DApplication::kPaste);
  253.     else
  254.         gViewCentral->DisableView(DApplication::kPaste);
  255. }  
  256.  
  257.  
  258. Boolean DClipboardMgr::DoMenuTask(long tasknum, DTask* theTask)
  259. {
  260.     switch (tasknum) {
  261.     
  262.         case DApplication::kShowClipboard:
  263. #if 0
  264.             if (fClipWindow == gWindowManager->CurrentWindow())
  265.                 fClipWindow->Close(); //CloseAndFree();     
  266.             else {
  267.                 fClipWindow->Open();
  268.                 fClipWindow->Select();
  269.                 }
  270. #endif
  271.             return true;
  272.             
  273.         default:
  274.             return DTaskMaster::DoMenuTask(tasknum, theTask);
  275.             break;
  276.     }
  277.  
  278.  
  279. Boolean DClipboardMgr::IsMyAction(DTaskMaster* action)
  280. {
  281.     switch (action->Id()) {
  282.         case DApplication::kShowClipboard:
  283.             return DoMenuTask(action->Id(), NULL);
  284.         default:
  285.             return DTaskMaster::IsMyAction(action);
  286.         }
  287. }
  288.  
  289.  
  290. void DClipboardMgr::Close()
  291. {
  292. #ifdef WIN_MAC    
  293.     LoadScrap();
  294. #endif
  295.  
  296.  
  297. short DClipboardMgr::PutToSystem(char* data, ulong datasize, long clipKind)
  298. {
  299.     long err= -1;
  300.  
  301. #ifdef WIN_MAC    
  302.     err = PutScrap( datasize, clipKind, data);
  303. #endif
  304.     return err;
  305.  
  306.  
  307.  
  308.